剧情接上篇博客
打完八皇后之后,我走着六亲不认的步子准备回去领技能点(不充钱有技能点你也是不会变强的),但在这时,我突然发现我迷路了。。。完了啊,没大佬和队友帮我我可咋出去啊,愁死我了,但幻想了一下我以后翻身当大佬的情形,我:不行,我要出去,我还没翻身呢,我还没装过X呢,不能凉在这个鬼地方!!
于是我就好好研究了一下走出迷宫的方法
迷宫问题描述:
定义一个二维数组:
int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
输入
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
输出
左上角到右下角的最短路径,格式如样例所示。
样例输入
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
样例输出
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
第一次我尝试用bfs走出迷宫,但到后面就开始瞎跑了,最后还是解决不了这个问题
#include<bits/stdc++.h>
using namespace std;
struct fuck
{
int x,y;
int p,q;
}que[1000];
int a[100][100],book[100][100];
int main()
{
int tx,ty;
int next[4][2]={ {0,1},
{1,0},
{0,-1},
{-1,0} };
int head=1,tail=1;
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
scanf("%d",&a[i][j]);
que[tail].x=1;
que[tail].y=1;
que[tail].p=1;
que[tail].q=1;
tail++;
book[1][1]=1;
int flag=0;
while(head<tail){
for(int k=0;k<=3;k++){
tx=que[head].x+next[k][0];
ty=que[head].y+next[k][1];
if(tx<1||tx>5||ty<1||ty>5)
continue;
if(a[tx][ty]==0&&book[tx][ty]==0){
book[tx][ty]=1;
que[tail].x=tx;
que[tail].y=ty;
que[tail].p=tx;
que[tail].q=ty;
tail++;
}
if(tx==5&&ty==5){
flag=1;
break;
}
}
if(flag==1)
break;
head++;
}
for(int i=1;i<=tail-1;i++)
cout<<"("<<que[i].p<<","<<que[i].q<<")"<<endl;
}
因为单纯的bfs只能找到出迷宫最少用多少步,而无法找到最优路径的,并且会出现瞎跑的情况,显得非常zz,所以我又研究了好久,找到了一个比较简单的方法来走出迷宫
#include<iostream>
#include<cstdio>
using namespace std;
int a[100][100],book[100][100],sum,p[100],q[100],e[100],r[100];//定义了e,r两个数组来保存走过的最短路径
int small=9999;
void dfs(int x,int y,int step)
{
int next[4][2]={ {0,1}, //表示走的方向
{1,0},
{0,-1},
{-1,0} };
int tx,ty;
if(x==5&&y==5){ //判断是否走到迷宫出口
if(step<small){ //更新最短距离
small=step;//更新最短路径
for(int i=0;i<=small;i++){//
e[i]=p[i];
r[i]=q[i];
}
}
return;
}
for(int k=0;k<=3;k++){//枚举上下左右四种情况
tx=x+next[k][0];
ty=y+next[k][1];
if(tx<1||tx>5||ty<1||ty>5)
continue;
if(a[tx][ty]==0&&book[tx][ty]==0){//判断是否能向下继续搜索
book[tx][ty]=1;//标记这个点,防止下面重复
p[step]=tx;//记录走的路径
q[step]=ty;
dfs(tx,ty,step+1);//继续向下搜索
book[tx][ty]=0;//取消标记
p[step]=0;
q[step]=0;
}
}
return;
}
int main()
{
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
scanf("%d",&a[i][j]);//输入迷宫
book[1][1]=1;//标记起点
dfs(1,1,0);//搜索开始
cout<<"("<<0<<", "<<0<<")"<<endl;//输出起点位置
for(int i=0;i<small;i++)//输出走过的最短路径
cout<<"("<<e[i]-1<<", "<<r[i]-1<<")"<<endl;
}
因为我对dfs比较熟悉,所以我尝试了用dfs把每条能走出迷宫的路都找到,然后找出最短的那条路,再输出路径,这个方法虽然说简单,但迷宫很大的话可能就会超时,不过还好这个迷宫不算很大,不然我就真的要凉到里面了(虽然现在我也挺凉的)
题外话:
这是我第一次在没有大佬和队友帮助的情况下独立完成的一道题,对我来说不仅仅是一种收获,更是值得纪念的一件事吧,但距离我翻身还有很长的一段路要走,所以这只能算是一个小插曲,没什么值得高兴的(我是咸鱼的事实还是不会改变的),以后我还是会继续朝着翻身的目标努力的!!